package com.qf.shiro.test;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;

public class RealmTest1 {

// 1、 通过ini配置文件创建securityManager
//
// 2、 subject执行login(token)提交认证，最终由securityManager调用Authenticator
//
// 3、 Authenticator调用realm查询用户信息
//
// 4、 realm根据token(usernamePasswordToken)中的账号查询用户信息，如果找不到则给Authenticator**返回null**，如果找到realm则再去匹配密码，匹配密码成功则认证通过。

    @Test
    public void test(){
        //构建SecurityManager工厂，IniSecurityManagerFactory可以从ini文件中初始化SecurityManager环境
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");

        // 通过工厂创建SecurityManager
        SecurityManager instance = factory.getInstance();
        // 使用SecurityUtils将securityManager设置到运行环境中
        SecurityUtils.setSecurityManager(instance);

        // 创建一个Subject实例，该实例认证要使用上边创建的securityManager进行
        Subject subject = SecurityUtils.getSubject();

        // 创建token令牌，记录用户认证的身份和凭证即账号和密码
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","111");
        System.err.println("token="+token);

        // 用户登录
        subject.login(token);
        System.out.println();
        // 用户认证状态
        Boolean isAuthenticated = subject.isAuthenticated();
        System.out.println("用户认证状态：" + isAuthenticated);

        // 退出登录
        subject.logout();
        isAuthenticated = subject.isAuthenticated();
        System.out.println("用户认证状态：" + isAuthenticated);
    }
}
